package com.baseandroid.baidutts;

import android.os.Handler;
import android.os.Message;

import com.baidu.tts.client.SpeechError;
import com.baidu.tts.client.SpeechSynthesizerListener;

/**
 * 在 MessageListener的基础上，和UI配合。
 */
public class UiMessageListener implements SpeechSynthesizerListener {

    public static final int INIT_ERROR = 0x1000;
    public static final int INIT_SUCCESS = 0x1001;
    public static final int AUTHINFO_ERROR = 0x1002;
    public static final int AUTHINFO_SUCCESS = 0x1003;
    public static final int BAIDUTTS_ERROR = 0x1004;
    public static final int BAIDUTTS_SUCCESS = 0x1005;

    private Handler mainHandler;

    private static final String TAG = "UiMessageListener";

    public UiMessageListener(Handler mainHandler) {
        super();
        this.mainHandler = mainHandler;
    }

    /**
     * 播放开始，每句播放开始都会回调
     * @param utteranceId
     */
    @Override
    public void onSynthesizeStart(String utteranceId) {

    }

    /**
     * 语音流 16K采样率 16bits编码 单声道
     * @param utteranceId
     * @param bytes 二进制语音，注意可能有空data的情况，可以忽略
     * @param progress 如合成百度语音问题这6个字，progress肯定是从0开始，到6结束。但progress无法和合成到第几个字对应
     */
    @Override
    public void onSynthesizeDataArrived(String utteranceId, byte[] bytes, int progress) {

    }

    /**
     * 合成正常结束，每句合成正常结束都会回调，如果过程中出错，则回调onError，不再回调此接口
     * @param utteranceId
     */
    @Override
    public void onSynthesizeFinish(String utteranceId) {

    }

    /**
     * 语音开始播放回调
     * @param utteranceId
     */
    @Override
    public void onSpeechStart(String utteranceId) {

    }

    /**
     * 播放进度回调接口，分多次回调
     * @param utteranceId
     * @param progress 如合成百度语音问题这6个字，progress肯定是从0开始，到6结束。但progress无法保证和合成到第几个字对应
     */
    @Override
    public void onSpeechProgressChanged(String utteranceId, int progress) {

    }

    /**
     * 播放正常结束，每句播放正常结束都会回调，如果过程中出错，则回调onError,不再回调此接口
     * @param utteranceId
     */
    @Override
    public void onSpeechFinish(String utteranceId) {
        BaiduTtsEvent baiduTtsEvent = new BaiduTtsEvent("0", "播放正常结束");
        baiduTtsEvent.setUtteranceId(utteranceId);
        sendToUiThread(BAIDUTTS_SUCCESS, baiduTtsEvent);
    }

    /**
     * 当合成或者播放过程中出错时回调此接口
     * @param utteranceId
     * @param speechError 包含错误码和错误信息
     */
    @Override
    public void onError(String utteranceId, SpeechError speechError) {
        BaiduTtsEvent baiduTtsEvent = new BaiduTtsEvent("" + speechError.code, "错误发生：" + speechError.description);
        baiduTtsEvent.setUtteranceId(utteranceId);
        sendToUiThread(BAIDUTTS_ERROR, baiduTtsEvent);
    }

    /**
     * 回调主线程信息
     */
    protected void sendToUiThread(int action, BaiduTtsEvent baiduTtsEvent) {
        if (mainHandler != null) {
            Message msg = Message.obtain();
            msg.what = action;
            msg.obj = baiduTtsEvent;
            mainHandler.sendMessage(msg);
        }
    }
}
